package com.ow.dva.module.park.controller;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ow.dva.module.base.controller.BaseController;
import com.ow.dva.module.base.entity.json.RT;
import com.ow.dva.module.base.entity.param.DvaPage;
import com.ow.dva.module.park.entity.Park;
import com.ow.dva.module.park.entity.ParkArea;
import com.ow.dva.module.park.entity.Parkinglot;
import com.ow.dva.module.park.entity.ParkinglotParam;
import com.ow.dva.module.park.service.ParkAreaService;
import com.ow.dva.module.park.service.ParkService;
import com.ow.dva.module.park.service.ParkinglotService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Map;


/**
 * <p>
 * 车位表 前端控制器
 * </p>
 *
 * @author YanZengBao
 * @since 2020-02-19
 * @version V1.0
 */
@Controller
@Api(tags = "车位表 相关控制器")
@RequestMapping("/parkinglot")
public class ParkinglotController extends BaseController {

    /**
    * 分页获取车位表数据列表信息
    * 创建时间：2020-02-19 YanZengBao
    * 修改时间：2020-02-19 YanZengBao 加注释
    * 修改时间：
    */
    @ApiOperation(value = "分页获取",notes = "批量获取车位表信息列表，分页，可携带条件")
    @RequiresPermissions("parkinglot:page")
    @GetMapping(value = "/page")
    public String page(DvaPage<Parkinglot> dvaPage, @RequestParam Map<String, Object> param, Model model){

        DvaPage<Parkinglot> page = parkinglotService.page(dvaPage,param);
        model.addAttribute("page",page);
        model.addAttribute("param",param);
        return "parkinglot/list";
    }

    /**
    * 进入车位表添加页面。
    * 创建时间：2020-02-19 YanZengBao
    * 修改时间：2020-02-19 YanZengBao 加注释
    * 修改时间：
    */
    @ApiOperation(value = "进入添加页面",notes = "进入车位表添加页面")
    @RequiresPermissions("parkinglot:add")
    @GetMapping(value = "/add")
    public String add(Model model){
        model.addAttribute("parkList",parkService.getParkList());
        return "parkinglot/add";
    }

    /**
    * 添加车位信息。
    * 创建时间：2020-02-19 YanZengBao
    * 修改时间：2020-02-19 YanZengBao 加注释
    * 修改时间：
    */
    @ApiOperation(value = "添加",notes = "添加单个车位表信息")
    @RequiresPermissions("parkinglot:add")
    @PostMapping("/save")
    @ResponseBody
    public RT save(Parkinglot parkinglot){

        parkinglot.setCreateTime(new Date());
        parkinglot.setParkinglotStatus(0);//车位状态（默认0）

        //停车场相关信息
        Park park = parkService.getById(parkinglot.getParkId());
        if(park == null) return RT.error(1,"停车场数据异常！");
        parkinglot.setParkName(park.getName());

        //验证车位数量是否超过停车场设置的总车位数
        int parkIdNum = parkinglotService.count(new QueryWrapper<Parkinglot>().eq("park_id", parkinglot.getParkId()));
        if(parkIdNum >= park.getParkinglotTotal()) return RT.error(1,"车位数量已添加至上限！添加失败！");

        //验证停车场内的车位编号是否重复
        int count = parkinglotService.count(new QueryWrapper<Parkinglot>()
                .eq("parkinglot_code", parkinglot.getParkinglotCode())
                .eq("park_id",parkinglot.getParkId()));
        if (count > 0) return RT.error(1,"车位编号已存在！请重新输入！");

        //区域详情
        getAreaInfo(parkinglot);

        return parkinglotService.save(parkinglot) ? RT.ok("保存成功！") : RT.error(1,"保存失败！");
    }

    /**
     * 描述：区域详情
     * 创建时间： 2020/2/26 YanZengBao
     * 修改时间： 2020/2/26 YanZengBao  加注释
     * 修改时间：
     */
    private void getAreaInfo(Parkinglot parkinglot){
        if(parkinglot.getAreaId() != null && !"".equals(parkinglot.getAreaId())){
            ParkArea parkArea = parkAreaService.getById(parkinglot.getAreaId());
            if(parkArea != null){
                parkinglot.setStatus(1);//区域绑定状态：已绑定
                parkinglot.setAreaName(parkArea.getName());
            }
        }else{
            parkinglot.setStatus(0);//未绑定
        }
    }


    /**
     * 描述： 快速添加车位（批量）
     * 创建时间： 2020/2/22 YanZengBao
     * 修改时间： 2020/2/22 YanZengBao  加注释
     * 修改时间：
     */
    @ApiOperation(value = "进入快速添加页面",notes = "进入车位表添加页面")
//    @RequiresPermissions("parkinglot:quickAdd")
    @GetMapping(value = "/quickAdd")
    public String quickAdd(Model model){
        model.addAttribute("parkList",parkService.getParkList());
        return "parkinglot/quickAdd";
    }

    /**
    * 进入车位表编辑页面。
    * 创建时间：2020-02-19 YanZengBao
    * 修改时间：2020-02-19 YanZengBao 加注释
    * 修改时间：
    */
    @ApiOperation(value = "进入编辑页面",notes = "进入车位表编辑页面")
    @RequiresPermissions("parkinglot:edit")
    @GetMapping(value = "/edit")
    public String edit(String id, Model model){

        model.addAttribute("data",parkinglotService.getById(id));

        return "parkinglot/edit";
    }

    /**
    * 修改车位表信息。
    * 创建时间：2020-02-19 YanZengBao
    * 修改时间：2020-02-19 YanZengBao 加注释
    * 修改时间： 2020-02-28 YanZengBao 增加编号重复验证
    */
    @ApiOperation(value = "修改",notes = "修改单个车位表信息")
    @RequiresPermissions("parkinglot:edit")
    @PostMapping("/update")
    @ResponseBody
    public RT update(Parkinglot parkinglot){

        //原信息
        Parkinglot old = parkinglotService.getById(parkinglot.getId());

        Parkinglot one = parkinglotService.getOne((new QueryWrapper<Parkinglot>()
                .eq("parkinglot_code", parkinglot.getParkinglotCode()))
                .eq("park_id",parkinglot.getParkId()));
        if(one != null) {
            if(old.getId().equals(one.getId())){
                return parkinglotService.updateById(parkinglot) ? RT.ok("修改成功！") : RT.error(1,"修改失败！");
            }else {
                return RT.error(1,"车位编号已存在");
            }
        }else{
            return parkinglotService.updateById(parkinglot) ? RT.ok("修改成功！") : RT.error(1,"修改失败！");
        }
    }

    /**
    * 删除单个车位表信息。
    * 创建时间：2020-02-19 YanZengBao
    * 修改时间：2020-02-19 YanZengBao 加注释
    * 修改时间：
    */
    @ApiOperation(value = "删除",notes = "删除单个车位表信息")
    @RequiresPermissions("parkinglot:delete")
    @PostMapping("/delete")
    @ResponseBody
    public RT delete(@ApiParam(name="要删除的车位表ID") String id){

        return parkinglotService.removeById(id) ? RT.ok("删除成功！") : RT.error(1,"删除失败！");
    }

    /**
    * 批量删除多个车位表信息。
    * 创建时间：2020-02-19 YanZengBao
    * 修改时间：2020-02-19 YanZengBao 加注释
    * 修改时间：
    */
    @ApiOperation(value = "批量删除",notes = "批量删除多个车位表信息")
    @RequiresPermissions("parkinglot:delete")
    @PostMapping("/deleteByIds")
    @ResponseBody
    public RT deleteByIds(@ApiParam(name="要删除的车位表ID List") @RequestParam List<String> ids){

        return parkinglotService.removeByIds(ids) ? RT.ok("批量删除成功！") : RT.error(1,"批量删除失败！");
    }

    /**
     * 描述：区域快速解绑车位
     * 创建时间： 2020/2/26 YanZengBao
     * 修改时间： 2020/2/26 YanZengBao  加注释
     * 修改时间：
     */
    @ApiOperation(value = "区域快速解绑车位",notes = "区域快速解绑车位")
    @PostMapping("/quickUnying")
    @ResponseBody
    public RT quickUnying(String areaId){
        return parkinglotService.quickUnyingByAreaId(areaId) ? RT.ok("该区域所有车位已解绑！") : RT.error(1,"快速解绑失败！");
    }


    /**
     * 描述：车位列表解绑车位
     * 创建时间： 2020/2/26 YanZengBao
     * 修改时间： 2020/2/26 YanZengBao  加注释
     * 修改时间：
     */
    @ApiOperation(value = "解绑车位",notes = "分区解绑车位")
    @PostMapping("/untyingParkinglot")
    @ResponseBody
    public RT untyingParkinglot(String id){
        Parkinglot parkinglot = parkinglotService.getById(id);
        if(parkinglot != null){
            parkinglot.setStatus(0);
            parkinglot.setAreaId(null);
            parkinglot.setAreaName(null);
        }
        return  parkinglotService.untyingParkinglot(parkinglot) ? RT.ok("解绑成功！") : RT.error(1,"解绑失败！");
    }


    @Resource
    ParkinglotService parkinglotService;
    @Resource
    ParkService parkService;
    @Resource
    ParkAreaService parkAreaService;
}
